package org.test.socket;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketService {
    //搭建服务器端
    public static void main(String[] args) throws IOException {
        SocketService socketService = new SocketService();
        //1、a)创建一个服务器端Socket，即SocketService
        socketService.oneServer();
    }

    /**
     * 启动Socket服务
     * */
    public void oneServer() {
        try {
            ServerSocket server = new ServerSocket(8888);
            System.out.println("bbb");
            Socket socket = server.accept(); // 没有收到数据之前会一直停在这一行
            System.out.println("ccc");
            InputStream is = socket.getInputStream();
            OutputStream os = socket.getOutputStream();
            byte[] bytes = new byte[256];
            // 接收数据
            int len;
            // 这里while循环正常是不会=-1的，总结下就是客户端和服务器建立了一条链接，客户端把文件发送完后就走了，服务器也不知道客户端发完了没，一直在傻傻的等
            // 退出循环有3个条件
            // 1. 客户端告诉服务端我发完了，在发送的那一端（也就是客户端）调用socket.shutdownOutput();这样服务器端就知道文件发送结束了，read方法就会返回-1
            // 2. 发送数据时，在数据首部给定文件长度，当接受完给定长度后手动跳出循环。
            // 3. 在服务器端设置超时，比如3秒，socket.setSoTimeout(3000);
            while ((len = is.read(bytes)) != -1) {
                System.out.println(len);
                System.out.println(new String(bytes, 0, len));
                // 发送数据
                BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
                bw.write("return data");
                bw.flush();
            }
            System.out.println("aaaaaaa");
            //5、关闭资源
            is.close();
            socket.close(); // 关闭Socket
            server.close(); // 关闭ServerSocket
        } catch (Exception e) {// 出错，打印出错信息
            System.out.println("Error." + e);
        }
    }
}

